'use strict';
/**
 * @author 张少辉
 * 创建时间： 2015-12-07 16:50:33
 * 创建任务号：无
 * 创建原因：封装sweetalert为angular
 * 参考路径：http://t4t5.github.io/sweetalert/
 */
angular.module('nec-admin.common')
    .provider('sweetAlert', [function() {
        var swal = window.swal;
        this.setDefaults = function(defaultConfig) {
            swal.setDefaults(defaultConfig);
        };
        this.$get = ['$rootScope', '_', function($rootScope, _) {

            function baseSwal(args, config) {
                var defaultCb = function() {},
                    configArray = Array.prototype.slice.call(args),
                    arg1 = configArray[0],
                    arg2 = configArray[1],
                    arg3 = configArray[2];
                if (_.isString(arg1)) {
                    config.title = arg1;
                    if (_.isPlainObject(arg3)) {
                        config = _.merge(config, arg3);
                    }
                } else if (_.isPlainObject(arg1)) {
                    config = _.merge(config, arg1);
                }
                self.swal(config, _.isFunction(arg2) ? arg2 : defaultCb);
            }

            var self = {

                /**
                 * alert 弹出框
                 * @param  {[String]} message 弹出信息
                 * @param {[Object]} config 弹出框配置信息
                 */
                alert: function(message, config) {
                    config = config || {};
                    config.title = message;
                    this.swal(config);
                },

                /**
                 * confirm 弹出框
                 * 具体配置参考：http://t4t5.github.io/sweetalert/
                 * 
                 * 注意：如果需要在回调方法中再次执行该服务的任务弹出框，则必须配置以下信息
                 * 确定后显示弹出框：closeOnConfirm:false
                 * 取消后显示弹出框：closeOnCancel:false
                 * 
                 * 参数形式1：
                 * @param {[String]} 表示提示信息
                 * @param {[Function]} 回调方法
                 *        	回调参数：@param {[Boolean]} 表示确定(true)或者取消(false)
                 * @param {[Object]} 弹出框配置
                 * @example
                 * sweetAlert.confirm('test',
                    function(isConfirm) {
                        console.log(isConfirm);
                    }, {
                        type: 'error',
                        closeOnConfirm: false
                    });
                 * 
                 * 参数形式2：
                 * @param {[Object]} 弹出框配置
                 * @param {[Function]} 回调方法
                 *        	回调参数：@param {[Boolean]} 表示确定(true)或者取消(false)
                 *
                 * @example
                 * sweetAlert.confirm({
                    title: 'test',
                    type: 'error',
                    closeOnConfirm: false
                }, function(isConfirm) {
                    console.log(isConfirm);
                });
                 * 
                 */
                confirm: function() {
                    var confirmConfig = {
                        title: 'title为必填属性',
                        showCancelButton: true,
                        confirmButtonText: '确定',
                        cancelButtonText: '取消'
                    };
                    baseSwal(arguments, confirmConfig);
                },

                /**
                 * prompt 弹出框
                 * 具体配置参考：http://t4t5.github.io/sweetalert/
                 * 
                 * 注意：如果需要在回调方法中再次执行该服务的任务弹出框，则必须配置以下信息
                 * 确定后显示弹出框：closeOnConfirm:false
                 * 取消后显示弹出框：closeOnCancel:false
                 * 
                 * 参数形式1：
                 * @param {[String]} 表示提示信息
                 * @param {[Function]} 回调方法
                 *        	回调参数：@param {[String|Boolean]} 表示确定(输入的内容)或者取消(false)
                 * @param {[Object]} 弹出框配置
                 * @example
                 * sweetAlert.prompt('test',
                    function(isConfirm) {
                        if (isConfirm === false) return false;
                        if (isConfirm === '') {
                            sweetAlert.showInputError('输入东西啊');
                            return false;
                        }
                        sweetAlert.alert('ok');
                    }, {
                        closeOnConfirm: false
                    });
                 * 
                 * 参数形式2：
                 * @param {[Object]} 弹出框配置
                 * @param {[Function]} 回调方法
                 *        	回调参数：@param {[String|Boolean]} 表示确定(输入的内容)或者取消(false)
                 * @example
                 * sweetAlert.prompt({
                        title: 'test',
                        closeOnConfirm: false
                    },
                    function(isConfirm) {
                        if (isConfirm === false) {
                            return false;
                        }
                        if (isConfirm === '') {
                            sweetAlert.showInputError('输入东西啊');
                            return false;
                        }
                        sweetAlert.alert('ok');
                    });
                 * 
                 */
                prompt: function() {
                    var promptConfig = {
                        title: 'title为必填属性',
                        showCancelButton: true,
                        type: 'input',
                        inputPlaceholder: '请输入信息',
                        confirmButtonText: '确定',
                        cancelButtonText: '取消'
                    };
                    baseSwal(arguments, promptConfig);
                },

                /**
                 * 调用方法
                 * 具体配置参考：http://t4t5.github.io/sweetalert/
                 * @param  {[String | Object]}	arg1 
                 *                    为String时，表示为title
                 *                    为Object时，表示为配置文件
                 * @param  {[String | Function]} arg2   
                 *                    为String时，表示为message
                 *                    为Function时，表示为回调方法
                 * @param  {[String]} arg3 当第二个参数是String是这个才有效,
                 *         表示为："warning", "error", "success", "info"
                 */
                swal: function(arg1, arg2, arg3) {
                    $rootScope.$evalAsync(function() {
                        if (typeof(arg2) === 'function') {
                            swal(arg1, function(isConfirm) {
                                $rootScope.$evalAsync(function() {
                                    arg2(isConfirm);
                                });
                            }, arg3);
                        } else {
                            swal(arg1, arg2, arg3);
                        }
                    });
                },

                /**
                 * 显示input的错误提示
                 * 注意：这个不是提示框，而是辅助prompt提示框的，目的是用于显示
                 * 错误提示的
                 * @param  {[String]} errorInfo 错误信息
                 */
                showInputError: function(errorInfo) {
                    $rootScope.$evalAsync(function() {
                        swal.showInputError(errorInfo);
                    });
                },

                /**
                 * 关闭
                 */
                close: function() {
                    $rootScope.$evalAsync(function() {
                        swal.close();
                    });
                }
            };

            return self;
        }];
    }]);
